{ "cells": [ { "cell_type": "markdown", "id": "b1e0bbf3", "metadata": {}, "source": [ "# Reinforcement learning" ] }, { "cell_type": "markdown", "id": "58b57fee", "metadata": {}, "source": [ "## Goal and perspectives\n", "\n", "This tutorial is mainly adapted from this article https://arxiv.org/pdf/2103.06294.pdf and inspired by the work done during the 2022 LOQCathon." ] }, { "attachments": {}, "cell_type": "markdown", "id": "8078725c", "metadata": {}, "source": [ "### Reinforcement learning\n", "\n", "Reinforcement learning is a machine learning framework where an agent tries to find the right actions to perform by interacting with an environment. This is modelled by an agent who is taking actions and receiving percepts from the environment which can be used to choose the next actions. At the end of an epoch (or a series of epochs), the environment rewards (or not) the agent according to the string of actions taken. From the reward, the agent learns and adapts their strategy for the next epochs.\n", "\n", "![reinforcement_learning.png](../_static/img/reinforcement-learning_reinforcement_learning.png)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "5a7f63da", "metadata": {}, "source": [ "In Quantum Reinforcement learning, the exchanged actions, percepts and rewards are now quantum states being exchanged between the environment and the agent. In their paper, the authors claimed to have found a quantum advantage in the time for training by making use of Grover's amplification method to reach good actions quicker, and the goal of this tutorial is to reproduce the main results of their paper:\n", "\n", "![results_paper.png](../_static/img/reinforcement-learning_results_paper.png)\n" ] }, { "cell_type": "markdown", "id": "4f74c3b5", "metadata": {}, "source": [ "## Imports of packages and configuration of display" ] }, { "cell_type": "code", "execution_count": 1, "id": "7085c79d", "metadata": {}, "outputs": [], "source": [ "from typing import Union\n", "\n", "from ipywidgets import FloatProgress\n", "from IPython.display import display\n", "\n", "import perceval as pcvl\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from perceval.components.unitary_components import Unitary, BS, PS\n", "from perceval.rendering.circuit import DisplayConfig, SymbSkin\n", "\n", "DisplayConfig.select_skin(SymbSkin)" ] }, { "cell_type": "markdown", "id": "edc77d36", "metadata": {}, "source": [ "## Grover's algorithm" ] }, { "cell_type": "markdown", "id": "c50e3403", "metadata": {}, "source": [ "We will now implement Grover's algorithm, firstly from a high-level picture (using unitaries) and then photonically (using Mach-Zehnder interferometers) in the same way that was done in the article." ] }, { "cell_type": "markdown", "id": "e89e9be7", "metadata": {}, "source": [ "### Grover's algorithm in high-level picture" ] }, { "cell_type": "code", "execution_count": 2, "id": "83faf254", "metadata": {}, "outputs": [], "source": [ "# Let's create a function that generates our circuit, given an angle xi\n", "\n", "def grover_circuit_unitaries(xi:float) -> pcvl.Circuit:\n", " # Unitary to go from |00> to cos(xi)|10> + sin(xi)|01>\n", " unitary_p = pcvl.Matrix(\n", " np.array([[np.cos(xi), -np.sin(xi)], [np.sin(xi), np.cos(xi)]])\n", " )\n", " # Unitary for Hadamard gate\n", " unitary_hadamard = pcvl.Matrix(1 / np.sqrt(2) * np.array([[1, 1], [1, -1]]))\n", " # Unitary for environment interaction, that switches the phase of the good state\n", " unitary_env = pcvl.Matrix(np.array([[0, -1], [-1, 0]]))\n", " # Unitary of the reflection\n", " unitary_reflection = pcvl.Matrix(\n", " np.array(\n", " [\n", " [np.cos(2 * xi), np.sin(2 * xi)],\n", " [np.sin(2 * xi), -np.cos(2 * xi)],\n", " ]\n", " )\n", " )\n", " \n", " # We can now assemble our circuit\n", " hadamard_component = Unitary(unitary_hadamard, \"H\")\n", " circuit = pcvl.Circuit(4) // (1, Unitary(unitary_p, \"P\")) // (0, hadamard_component) // (2, hadamard_component) // (2, Unitary(unitary_env, \"env\"))\\\n", " // (0, hadamard_component) // (2, hadamard_component) // (1, Unitary(unitary_reflection, \"reflection\"))\n", " return circuit" ] }, { "cell_type": "code", "execution_count": 3, "id": "94b60295", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\nP\n\n\n\n\nH\n\n\n\n\nH\n\n\n\nenv\n\n\n\nH\n\n\n\nH\n\n\n\n\nreflection\n\n\n\n\n\n\n0\n1\n2\n3\n0\n1\n2\n3\n" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pcvl.pdisplay(grover_circuit_unitaries(np.pi/3))" ] }, { "cell_type": "markdown", "id": "01ddb6f0", "metadata": {}, "source": [ "One step of amplitude amplification in Grover's algorithm should rotate our state from a $\\xi$ angle to a $3\\xi$ angle from the loosing state to the winning state. Hence we can check the validity of our Grover's amplification algorithm by inputting a photon in the spatial mode 1 and detecting at spatial mode 2. This should follow a $\\sin(3\\xi)^2$ distribution." ] }, { "cell_type": "code", "execution_count": 4, "id": "d1f06163", "metadata": {}, "outputs": [], "source": [ "xis = np.linspace(0, np.pi/2, 100)\n", "results = []\n", "for xi in xis:\n", " circuit = grover_circuit_unitaries(xi)\n", " \n", " backend = pcvl.BackendFactory().get_backend()\n", " \n", " simulator = backend(circuit)\n", " input_state = pcvl.BasicState([0, 1, 0, 0])\n", " \n", " results.append(simulator.prob(input_state, pcvl.BasicState([0, 0, 1, 0])))" ] }, { "cell_type": "code", "execution_count": 5, "id": "09fc599f", "metadata": {}, "outputs": [ { "data": { "text/plain": "" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(xis, results, \"-o\", label=\"Simulation\")\n", "plt.plot(xis, np.sin((3*xis)) ** 2, \"--\", label=\"Theoritical\")\n", "plt.title(\"Probability after Grover's amplification\")\n", "plt.xlabel(\"$\\\\xi$\")\n", "plt.ylabel(\"Probability\")\n", "plt.grid()\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "4ebd4183", "metadata": {}, "source": [ "### Designing the circuit with Mach-Zehnder interferometers" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a46700fb", "metadata": {}, "source": [ "In the article they have used Mach-Zehnder interferometers (see below) to realize all the circuits.\n", "\n", "![mzi.png](../_static/img/reinforcement-learning_mzi.png)\n", "\n", "\n", "We want to perform the following unitary transformation (equation A.19 in the paper)\n", "\n", "$$U_{\\theta,\\varphi} = \\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix}$$\n", "\n", "However taking the MZI as shown and using the Rx convention for beam splitters yields the following matrix (see documentation [here](https://perceval.quandela.net/docs/components.html#beam-splitter)).\n", "\n", "\n", "$$ie^{i\\frac{\\theta}{2}}\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix}$$\n", "\n", "To remove this global phase effect, we use phase shifters with angle $\\theta_2$ to be $-\\frac \\pi 2 - \\frac \\theta 2$:" ] }, { "cell_type": "code", "execution_count": 6, "id": "9cc0419f", "metadata": {}, "outputs": [], "source": [ "def mzi(name:str, theta:Union[float, pcvl.Parameter], phi:Union[float, pcvl.Parameter],theta_2:Union[float, pcvl.Parameter]) -> pcvl.Circuit:\n", " # For the mzi to be in the right shape:\n", " # theta_2 should be set to '- pi/2 - theta/2'\n", " # however we cannot pass a symbolic expression to the input of PS\n", " # so we need to define a third angle theta_2 that we will set to '- pi/2 - theta/2' later on\n", " return (\n", " pcvl.Circuit(2, name=name)\n", " .add(0, BS())\n", " .add(0, PS(theta))\n", " .add(0, BS())\n", " .add(0, PS(phi))\n", " .add(0, PS(theta_2))\n", " .add(1, PS(theta_2))\n", " )\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "79a8d2a1", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\nRx\n\n\nΦ=theta_t\n\n\n\n\nRx\n\n\nΦ=phi_t\n\n\nΦ=theta_2\n\n\nΦ=theta_2\n\n\n\n0\n1\n0\n1\n" }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "theta_t = pcvl.P(\"theta_t\")\n", "phi_t = pcvl.P(\"phi_t\")\n", "theta_2 = pcvl.P(\"theta_2\")\n", "\n", "pcvl.pdisplay(mzi(\"test\", theta_t, phi_t, theta_2))" ] }, { "cell_type": "markdown", "id": "8f282446", "metadata": {}, "source": [ "#### Implementing the gates with MZI" ] }, { "cell_type": "markdown", "id": "1227b4b9", "metadata": {}, "source": [ "##### Hadamard\n", "\n", "For the Hadamard, we want $\\theta$ and $\\varphi$ such that\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 & 1\\\\ 1 & -1 \\end{pmatrix}$$\n", "\n", "so we set $\\theta = \\frac{\\pi}{2}$ and $\\varphi = 0$." ] }, { "cell_type": "code", "execution_count": 8, "id": "5edc592f", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "text/html": "$\\left[\\begin{matrix}0.707106781186547 - 1.11022302462516 \\cdot 10^{-16} i & \\frac{i \\left(-3.33066907387547 \\cdot 10^{-16} - 1.4142135623731 i\\right)}{2}\\\\\\frac{i \\left(-3.33066907387547 \\cdot 10^{-16} - 1.4142135623731 i\\right)}{2} & -0.707106781186547 + 1.11022302462516 \\cdot 10^{-16} i\\end{matrix}\\right]$" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hadamard = mzi(\"H\", np.pi/2, 0, -np.pi/2 - np.pi/4)\n", "\n", "pcvl.pdisplay(hadamard.U)" ] }, { "cell_type": "markdown", "id": "a5ce938e", "metadata": {}, "source": [ "##### Environnement\n", "For the environnement, we want a matrix of the form\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}0 & -1\\\\ -1 & 0 \\end{pmatrix}$$\n", "\n", "which gives $\\theta = -2\\pi$ and $\\varphi=0$." ] }, { "cell_type": "code", "execution_count": 9, "id": "5a76c917", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "text/html": "$\\left[\\begin{matrix}1.22464679914735 \\cdot 10^{-16} & \\frac{i \\left(3.67394039744206 \\cdot 10^{-16} + 2.0 i\\right)}{2}\\\\\\frac{i \\left(3.67394039744206 \\cdot 10^{-16} + 2.0 i\\right)}{2} & -1.22464679914735 \\cdot 10^{-16}\\end{matrix}\\right]$" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "env = mzi(\"U_E\", -2 * np.pi, 0, -np.pi/2 + np.pi)\n", "\n", "pcvl.pdisplay(env.U)" ] }, { "cell_type": "markdown", "id": "5c740108", "metadata": {}, "source": [ "##### Preparation of state\n", "\n", "For the preparation of the state, we want a matrix of the form\n", "\n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}\\cos(\\xi) & -\\sin(\\xi)\\\\ \\sin(\\xi) & \\cos(\\xi) \\end{pmatrix}$$\n", "\n", "which gives $\\theta = \\pi - 2\\xi$ and $\\varphi=0$.\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "30243876", "metadata": {}, "outputs": [], "source": [ "theta_prep = pcvl.P(\"theta_prep\") # We will set it to pi - 2*xi later\n", "theta2_prep = pcvl.P(\"theta2_prep\") # We will set it to -pi/2 - pi/2 + xi = -pi + xi later as we cannot pass symbolic expression to the function mzi\n", "state_prep = mzi(\"U_p\", theta_prep, 0, theta2_prep)" ] }, { "cell_type": "markdown", "id": "6905688f", "metadata": {}, "source": [ "##### Reflection\n", "\n", "For the reflection, we want a matrix of the form \n", "\n", "$$\\begin{pmatrix}e^{i\\varphi}\\sin\\left(\\frac{\\theta}{2}\\right) & e^{i\\varphi}\\cos\\left(\\frac{\\theta}{2}\\right)\\\\ \\cos\\left(\\frac{\\theta}{2}\\right) & -\\sin\\left(\\frac{\\theta}{2}\\right) \\end{pmatrix} = \\begin{pmatrix}\\cos(2\\xi) & \\sin(2\\xi)\\\\ \\sin(2\\xi) & -\\cos(2\\xi) \\end{pmatrix}$$\n", "\n", "which gives $\\theta = \\pi - 4\\xi$ and $\\varphi=0$" ] }, { "cell_type": "code", "execution_count": 11, "id": "a640d216", "metadata": {}, "outputs": [], "source": [ "theta_ref = pcvl.P(\"theta_ref\") # We will set it to pi - 4*xi later\n", "theta2_ref = pcvl.P(\"theta2_ref\") # We will set it to -pi/2 - pi/2 + 2xi = -pi + 2xi later as we cannot pass symbolic expression to the function mzi\n", "ref = mzi(\"U_ref\", theta_ref, 0, theta2_ref)" ] }, { "cell_type": "markdown", "id": "f0e532b8", "metadata": {}, "source": [ "### Grover's algorithm with MZI" ] }, { "cell_type": "markdown", "id": "3acb6e44", "metadata": {}, "source": [ "We now implement again Grover's algorithm with MZI implementation as a sanity check for the definitions of the gates we chose." ] }, { "cell_type": "code", "execution_count": 12, "id": "5029c0f7", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\nU_P\n\n\n\nRx\n\n\nΦ=theta_prep\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=theta2_prep\n\n\nΦ=theta2_prep\n\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\nU_E\n\n\n\nRx\n\n\nΦ=2*pi\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=pi/2\n\n\nΦ=pi/2\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\n\nU_REF\n\n\n\nRx\n\n\nΦ=theta_ref\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=theta2_ref\n\n\nΦ=theta2_ref\n\n\n\n\n\n\n\n0\n1\n2\n3\n0\n1\n2\n3\n" }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circuit = pcvl.Circuit(4)\n", "circuit.add(1, state_prep).add(0, hadamard).add(2, hadamard).add(2, env).add(0, hadamard).add(2, hadamard).add(1, ref)\n", "\n", "pcvl.pdisplay(circuit, recursive=True)" ] }, { "cell_type": "code", "execution_count": 13, "id": "3d002e05", "metadata": {}, "outputs": [], "source": [ "results_mzis = []\n", "\n", "for xi in xis:\n", " # Update values in the circuit\n", " theta1 = np.pi - 2*xi #set the angle as explained above in 'Preparation of state'\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi #set the angle as explained above in 'Reflection'\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " \n", " backend = pcvl.BackendFactory().get_backend()\n", " \n", " simulator = backend(circuit)\n", " input_state = pcvl.BasicState([0, 1, 0, 0])\n", " \n", " results_mzis.append(simulator.prob(input_state, pcvl.BasicState([0, 0, 1, 0])))" ] }, { "cell_type": "code", "execution_count": 14, "id": "68692596", "metadata": {}, "outputs": [ { "data": { "text/plain": "" }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(xis, results, \"-o\", label=\"Simulation (Unitaries)\")\n", "plt.plot(xis, results_mzis, \"-o\", label=\"Simulation (MZIs)\")\n", "plt.plot(xis, np.sin((3*xis)) ** 2, \"--\", label=\"Theoritical\")\n", "plt.title(\"Probability after Grover's amplification\")\n", "plt.xlabel(\"$\\\\xi$\")\n", "plt.ylabel(\"Probability\")\n", "plt.grid()\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "f746dd6f", "metadata": {}, "source": [ "## Reproducing the results of the paper" ] }, { "cell_type": "markdown", "id": "630086db", "metadata": {}, "source": [ "### Classical circuit" ] }, { "attachments": {}, "cell_type": "markdown", "id": "8e07dd70", "metadata": {}, "source": [ "The classical circuit emulates the agent choosing a good action with probability $\\varepsilon = \\sin^2(\\xi)$. To this end, the operation $U_p |0_A0_R\\rangle = \\cos(\\xi)|0_A0_R\\rangle + \\sin(\\xi)|1_A0_R\\rangle$ is implemented putting the action state in a superposition with the corresponding amplitude. Then the interaction with the environment will make the second qubit switch only if the first qubit is in the state $|1_A\\rangle$, hence putting the reward qubit in the $|1_R\\rangle$ state.\n", "\n", "![classical_circuit.png](../_static/img/reinforcement-learning_classical_circuit.png)\n", "\n", "The detector D1, corresponding to $|0_A0_R\\rangle$, will click with probability $\\cos^2(\\xi) = 1-\\varepsilon$ and corresponds to no reward, whereas detector D2, corresponding to $|1_A1_R\\rangle$, will click with probability $\\sin^2(\\xi) = \\varepsilon$ and correspond to a rewarded action.\n", "\n", "Both operations $U_p$ and $U_e$ were already implemented as part of the Grover's algorithm." ] }, { "cell_type": "code", "execution_count": 15, "id": "4fe0e455", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\nU_P\n\n\n\nRx\n\n\nΦ=0\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=3*pi/2\n\n\nΦ=3*pi/2\n\n\n\n\nU_E\n\n\n\nRx\n\n\nΦ=2*pi\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=pi/2\n\n\nΦ=pi/2\n\n\n\n\n\n\n\n0\n1\n2\n3\n0\n1\n2\n3\n" }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classical_circuit = pcvl.Circuit(4)\n", "classical_circuit.add(1, state_prep).add(2, env) # circuit for classical strategy\n", "pcvl.pdisplay(classical_circuit, recursive=True)" ] }, { "cell_type": "markdown", "id": "d288dabc", "metadata": {}, "source": [ "### Quantum circuit" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6fad7238", "metadata": {}, "source": [ "The quantum circuit performs a Grover's amplification step in order to get the state closer to a rewarded state. However, during this step, no reward is ever perceived and a classical round is still needed afterward to check if the state is rewarded or not.\n", "\n", "![quantum_circuit.png](../_static/img/reinforcement-learning_quantum_circuit.png)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c3f95a3e", "metadata": {}, "source": [ "We will here, directly append the classical circuit (without state preparation) to the quantum circuit, so that the whole operation is done with one circuits. Note that we will count this as being 2 epochs to have a fair comparison with the classical strategy.\n", "\n", "![classical_quantum.png](../_static/img/reinforcement-learning_classical_quantum.png)" ] }, { "cell_type": "code", "execution_count": 16, "id": "c1a8c795", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\nU_P\n\n\n\nRx\n\n\nΦ=0\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=3*pi/2\n\n\nΦ=3*pi/2\n\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\nU_E\n\n\n\nRx\n\n\nΦ=2*pi\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=pi/2\n\n\nΦ=pi/2\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\nH\n\n\n\nRx\n\n\nΦ=pi/2\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=5*pi/4\n\n\nΦ=5*pi/4\n\n\n\nU_REF\n\n\n\nRx\n\n\nΦ=pi\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=0\n\n\nΦ=0\n\n\n\n\nU_E\n\n\n\nRx\n\n\nΦ=2*pi\n\n\n\n\nRx\n\n\nΦ=0\n\n\nΦ=pi/2\n\n\nΦ=pi/2\n\n\n\n\n\n\n\n0\n1\n2\n3\n0\n1\n2\n3\n" }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quantum_circuit = pcvl.Circuit(4)\n", "quantum_circuit.add(1, state_prep).add(0, hadamard).add(2, hadamard).add(2, env).add(0, hadamard).add(2, hadamard).add(1, ref) #circuit for quantum strategy\n", "quantum_circuit.add(2,env) #appending directly the classical round (without preparation) at the end\n", "pcvl.pdisplay(quantum_circuit, recursive=True)" ] }, { "cell_type": "markdown", "id": "367229cf", "metadata": {}, "source": [ "### Simulation" ] }, { "cell_type": "code", "execution_count": 17, "id": "318570c5", "metadata": {}, "outputs": [], "source": [ "# Simulation parameters\n", "N_AGENTS = 100 #number of agents that we simulate and average over\n", "N_EPOCH = 1000\n", "H_0 = 99\n", "H_1 = 1\n", "EPS0 = H_1 / (H_0+H_1)" ] }, { "cell_type": "markdown", "id": "46ff0d04", "metadata": {}, "source": [ "#### Reward function\n", "First we define a reward function that takes as an input a circuit, output a sample state and returns True if it corresponds to a rewarded state (False otherwise)." ] }, { "cell_type": "code", "execution_count": 18, "id": "2369c08f", "metadata": {}, "outputs": [], "source": [ "def get_reward(circuit: pcvl.Circuit) -> bool:\n", " proc = pcvl.Processor(\"SLOS\", circuit)\n", " proc.with_input(pcvl.BasicState([0, 1, 0, 0]))\n", " sampler = pcvl.algorithm.Sampler(proc)\n", " samples = sampler.samples(1)\n", "\n", " # Take a random sample and check if it's the rewarded state or not\n", " return samples[\"results\"][0] == pcvl.BasicState([0, 0, 0, 1])\n" ] }, { "cell_type": "markdown", "id": "ae5b5de3", "metadata": {}, "source": [ "#### Classical strategy" ] }, { "cell_type": "markdown", "id": "2aa85433", "metadata": {}, "source": [ "Below we gather everything defined above to run the purely classical strategy from the article." ] }, { "cell_type": "code", "execution_count": 19, "id": "5cdf619c", "metadata": {}, "outputs": [ { "data": { "text/plain": "FloatProgress(value=0.0)", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "01180253c84e46e993d07c2fef47ea27" } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eta_classical = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS): #Loop and average over all agents\n", " f.value = agent\n", " # Initialize initial score\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability and corresponding angles\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " for i in range(N_EPOCH):\n", " if get_reward(classical_circuit): #update policy if output state corresponds to a rewarded state\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " eps_array.append(1)\n", " else:\n", " eps_array.append(0)\n", "\n", " eta_classical.append(eps_array)\n", "\n", "eta_classical = np.array(eta_classical)\n", "f.value = N_AGENTS" ] }, { "cell_type": "code", "execution_count": 20, "id": "413721c6", "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_classical, axis=0)[::2], \".\", label=\"Fully classical strategy\")\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "9ab3f4c9", "metadata": {}, "source": [ "Here we plot the proportion of agents that gets a reward. In the first epochs, the probability of getting a reward is small and few agents get some. However, once an agent gets a reward, they are more likely to get a reward in the future." ] }, { "cell_type": "markdown", "id": "e4e33516", "metadata": {}, "source": [ "#### Quantum strategy" ] }, { "cell_type": "markdown", "id": "3235182e", "metadata": {}, "source": [ "Below we run the purely quantum strategy." ] }, { "cell_type": "code", "execution_count": 21, "id": "63cdbf11", "metadata": {}, "outputs": [ { "data": { "text/plain": "FloatProgress(value=0.0)", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "a2073a10b97e4271baac17c39a42bb81" } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eta_quantum = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS):\n", " f.value = agent\n", " # Initialize initial scores\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " for i in range(N_EPOCH//2):\n", " if get_reward(quantum_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " \n", " eps_array.append(0.5)\n", " eps_array.append(0.5)\n", " else:\n", " eps_array.append(0)\n", " eps_array.append(0)\n", "\n", " eta_quantum.append(eps_array)\n", "\n", "eta_quantum = np.array(eta_quantum)\n", "f.value=N_AGENTS" ] }, { "cell_type": "code", "execution_count": 22, "id": "6678e44f", "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEGCAYAAABlxeIAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAA+z0lEQVR4nO29e5hU1Zno/XurupuLNNCAItpcBSE2N7tBcchRUGIkQT1B8ql48mlOkCSDk/hk9IxJ5iHGnDmPkzDRzISZhDHGM+dTMIpODEfjLaDGEYHuEe0WkaalsbjTFE0jl+6uWt8ftfdm165dXdWXunTX+3seHmrf1l5r7+p613qvYoxBURRFUQK57oCiKIqSH6hAUBRFUQAVCIqiKIqFCgRFURQFUIGgKIqiWBTlugNdZcSIEWbcuHFduvazzz7jvPPO69kO5Tk65sJAx1wYdGfM1dXVR40x5/sd67UCYdy4cWzbtq1L127atIl58+b1bIfyHB1zYaBjLgy6M2YRaUx2TFVGiqIoCqACQVEURbFQgaAoiqIAvdiGoCh9gba2NkKhEGfOnOmR9oYMGcKOHTt6pK3ego7Zn/79+1NeXk5xcXHa7apAUJQcEgqFKC0tZdy4cYhIt9traWmhtLS0B3rWe9AxJ2KMoampiVAoxPjx49NuV1VGipJDzpw5w/Dhw3tEGCiKjYgwfPjwTq88VSBkgOrGMKs31lPdGM51V5RegAoDJRN05XulKqMeproxzB2Pbaa1PUpJUYAnl82hamxZrrulKIqSEl0h9BDVjWF+8PwH/M369znTFiVqoK09yvqakK4WlLwmGAwyc+ZM59+ePXuSnvvEE09wzz33APDggw+yatWqLPUyPTZt2sR//Md/ZO1+e/bs4amnnur0dcePH+ef//mfM9Cj7qErhB6gujHM7WveoTUSX2xIAsKz1SHaI7paUPKXAQMG8N577+W6Gz3Cpk2bGDRoEH/xF3+RlfvZAmHp0qUJx9rb2ykq8v+JtQXCX/7lX2a6i51CVwg9wOaGJtoiiZXnKkYNpj1ybrWwuaEpB71T+hrZsFGNGzeOo0ePArBt27YO0yTs3r2byspKZ3vXrl1x2zbV1dXMmDGDGTNmcP/99zN16lQgftUBsGjRIjZt2gTAt7/9bWbNmkVFRQU/+tGP4vr3ox/9iMrKSubMmcNHH33Enj17+NWvfsUjjzzCzJkzeeutt7jrrrt49tlnnesGDRoExATHNddcw80338yECRN44IEHePLJJ7niiiuYNm0au3fvTuj/G2+84ayiLr/8clpaWnjggQd46623mDlzJo888ghPPPEEN910E9deey3XXXcdJ0+e5LrrrqOyspJp06bx+9//HoAHHniA3bt3M3PmTO6//34AfvaznzF79mymT58eN9af/OQnTJ48mc9//vPcfvvtrFq1ioaGhrSeeWfRFUIPMGfCcIqDErdCKCkKcOvsMew8VEdbe5TiogBzJgzPYS+VvkAmbFSnT59m5syZAIwfP57nn3++U9dfcsklDBkyhPfee4+ZM2fy29/+lq9//esJ533961/nl7/8JVdffbXzI5iKv/u7v2PYsGFEIhGuu+463n//faZPnw7AiBEjqKmp4ec//zmrVq3iscce41vf+haDBg3ivvvuA+A3v/lN0ra3b9/Ojh07GDZsGBMmTGDZsmVs2bKFX/ziF/zTP/0Tjz76aNz5q1atYvXq1cydO5eTJ0/Sv39/Hn74YVatWsWGDRuAmHCrqanh/fffZ9iwYbS3t/P8888zePBgjh49ypw5c7jpppt4+OGHqa2tdVZmr7zyCrt27WLLli0YY7jpppt48803GTBgAOvXr2f79u20tbVRWVlJVVUVEyZMSOuZdxYVCD1A1dgy1i6/ivU1IY62nOX80n4sriynamwZky8sZXNDE3MmDFd1kdJtNjc00doev+rs7veqJ1RGy5Yt47e//S0///nPefrpp9myZUvc8ePHj3P8+HGuvvpqAL72ta/x0ksvpWz3d7/7HWvWrKG9vZ0DBw7w4YcfOgJh8eLFAMycOZMXX3yx032ePXs2o0aNAmJC7frrrwdg2rRpbNy4MeH8uXPn8r3vfY877riDxYsXU15e7tvuF77wBYYNGwbE4gF+8IMf8OabbxIIBNi3bx+HDh1KuOaVV17hlVde4fLLLwfg5MmT7Nq1i5aWFm6++Wb69+9P//79ufHGG51rUj3zrqACoZtUN4bjBME3r7kk7g/U/myri1QoKN1hzoThlBQFMr7qLCoqIhqNAqTly37LLbfw4x//mGuvvZaqqiqGD0+/X+57ue/3ySefsGrVKrZu3UpZWRl33XVXXF/69esHxIzi7e3tKduORqO0trYmXA8QCASc7UAg4NveAw88wJe/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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_quantum, axis=0)[::2], \".\", label=\"Fully quantum strategy\")\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "fc7ac058", "metadata": {}, "source": [ "Here we see a different behavior. With Grover's amplification, getting a reward is more likely in the first epochs. However, as the probability gets updated, one of Grover's amplification feature will manifest itself: we start to \"overshoot\" or rotate too much and we get past the winning state, and once we got past it, it is not possible to recover the winning state. We converge to a state with zero probability of getting a reward and nothing will get updated. This is why we need to consider an hybrid strategy." ] }, { "cell_type": "markdown", "id": "eee6f816", "metadata": {}, "source": [ "#### Classical-quantum strategy" ] }, { "cell_type": "markdown", "id": "dfe8e73e", "metadata": {}, "source": [ "We want to start with a quantum strategy, and then switch to a classical strategy when e start to overshoot. This happens when the probability of winning in the quantum strategy gets lower than the classical one.\n", "\n", "Due to normalization (and the fact that the quantum strategy takes twice as many epochs than the classical one), this corresponds to solve the equation\n", "\n", "$$\\frac{1}{2}\\sin^2(3\\xi) = \\sin^2(\\xi)$$\n", "\n", "The solution can be found numerically and gives a value of $\\xi = 0.6811$ which corresponds to $\\varepsilon=\\sin^2(\\xi)=0.396$.\n", "\n", "We then choose $Q_L$ to be the value where we switch from quantum to classical and the only requirement is $Q_L<0.396$. To follow [1] we will choose, $Q_L = 0.37$." ] }, { "cell_type": "code", "execution_count": 23, "id": "90a4acc1", "metadata": {}, "outputs": [ { "data": { "text/plain": "FloatProgress(value=0.0)", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "ed54f36554d34b0b974ec0f1beb16340" } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "QL = 0.37\n", "eta_classical_quantum = []\n", "\n", "# Pourcentage bar\n", "f = FloatProgress(min=0, max=N_AGENTS)\n", "display(f)\n", "\n", "for agent in range(N_AGENTS):\n", " f.value = agent\n", " # Initialize initial scores\n", " h_0 = H_0\n", " h_1 = H_1\n", " eps = h_1 / (h_0 + h_1)\n", "\n", " # Initialize circuit with initial probability\n", " xi = np.arcsin(eps**0.5)\n", " \n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", "\n", " # Arrays of epsilon\n", " eps_array = []\n", " i = 0\n", " while i < N_EPOCH:\n", " if eps < QL:\n", " # Perform a quantum round\n", " if get_reward(quantum_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", " \n", " theta2 = np.pi - 4*xi\n", " theta_ref.set_value(theta2)\n", " theta2_ref.set_value(-np.pi/2 - theta2/2)\n", " eps_array.append(0.5)\n", " eps_array.append(0.5)\n", " else:\n", " eps_array.append(0)\n", " eps_array.append(0)\n", "\n", " # Update epoch by 2\n", " i = i + 2\n", " else:\n", " # Perform a classical round\n", " if get_reward(classical_circuit):\n", " h_1 = h_1 + 2\n", " eps = h_1 / (h_0 + h_1)\n", " xi = np.arcsin(eps**0.5)\n", " theta1 = np.pi - 2*xi\n", " theta_prep.set_value(theta1)\n", " theta2_prep.set_value(-np.pi/2 - theta1/2)\n", "\n", " eps_array.append(1)\n", " else:\n", " eps_array.append(0)\n", " # Update epoch by 1\n", " i = i + 1\n", "\n", " eta_classical_quantum.append(eps_array)\n", "\n", "eta_classical_quantum = np.array(eta_classical_quantum)\n", "f.value=N_AGENTS" ] }, { "cell_type": "markdown", "id": "20a92f86", "metadata": {}, "source": [ "#### Plots" ] }, { "cell_type": "code", "execution_count": 24, "id": "957d52f1", "metadata": {}, "outputs": [ { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.mean(eta_classical, axis=0)[::2], \".\", label=\"Fully classical strategy\")\n", "plt.plot(np.mean(eta_quantum, axis=0)[::2], \".\", label=\"Fully quantum strategy\")\n", "plt.plot(np.mean(eta_classical_quantum,axis=0,)[::2],\".\",label=\"Quantum-classical strategy\",)\n", "plt.xlabel(\"Even epochs\")\n", "plt.ylabel(\"$\\eta$\")\n", "plt.legend()\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "a4390ce7", "metadata": {}, "source": [ "## Conclusion" ] }, { "attachments": {}, "cell_type": "markdown", "id": "34dd02db", "metadata": {}, "source": [ "Simulating the circuits of [1], we are able to reproduce their results. Data are still noisier than the results due to a smaller number agents. A parallelized version of this code was executed with 10 000 agents and the following results were found:\n", "\n", "![results_10000.png](../_static/img/reinforcement-learning_results_10000.png)\n", "\n", "which are very close to the paper results.\n", "\n", "It's possible to play with the value of $Q_L$ and the number of agents. Remember that the simulation time is linear with the number of agents." ] }, { "cell_type": "markdown", "id": "911dd875", "metadata": {}, "source": [ "## Acknowledgement" ] }, { "cell_type": "markdown", "id": "7721eae9", "metadata": {}, "source": [ "This work was initially done during the Hackathon on Linear Optical Quantum Communication (LOQCathon) organised by [Quandela](https://www.quandela.com/) and [QICS](https://qics.sorbonne-universite.fr/en) (Quantum Information Center of Sorbonne Université), by the team composed of Luís Bugalho, Laura dos Santos Martins, Paolo Fittipaldi, Yoann Piétri and Verena Yacoub. The supervision was provided by Pierre-Emmanuel Emeriau." ] }, { "cell_type": "markdown", "id": "441c442e", "metadata": {}, "source": [ "## References\n", "\n", "> [1] V. Saggio, B. E. Asenbeck, A. Hamann, et al. Experimental quantum speed-up in reinforcement learning agents. [Nature](https://doi.org/10.1038/s41586-021-03242-7), 591(7849), 229-233 (2021).\n", "\n", " > [2] A. Hamann, S. Wölk. Performance analysis of a hybrid agent for quantum-accessible reinforcement learning. [New Journal of Physics](https://doi.org/10.1088/1367-2630/ac5b56 ), 24(3), 033044 (2022)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 5 }